Coverage Report

Created: 2021-08-28 18:14

D:\git\skunkworks\herald-for-cpp\herald\include\herald\analysis\runner.h
Line
Count
Source (jump to first uncovered line)
1
//  Copyright 2021 Herald Project Contributors
2
//  SPDX-License-Identifier: Apache-2.0
3
//
4
5
#ifndef HERALD_ANALYSIS_RUNNER_H
6
#define HERALD_ANALYSIS_RUNNER_H
7
8
#include "sampling.h"
9
10
#include <variant>
11
#include <array>
12
13
// debug only
14
// #include <iostream>
15
16
namespace herald {
17
namespace analysis {
18
19
using namespace sampling;
20
21
/// \brief Manages a set of lists for a particular Sample Value Type
22
template <typename ValT, std::size_t Size>
23
struct ListManager {
24
  using value_type = ValT;
25
  static constexpr std::size_t max_size = Size;
26
27
28
  ListManager() = default;
??0?$ListManager@H$0P@@analysis@herald@@QEAA@XZ
Line
Count
Source
27
3
  ListManager() = default;
??0?$ListManager@N$0P@@analysis@herald@@QEAA@XZ
Line
Count
Source
27
1
  ListManager() = default;
??0?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@QEAA@XZ
Line
Count
Source
27
18
  ListManager() = default;
??0?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@QEAA@XZ
Line
Count
Source
27
6
  ListManager() = default;
28
28
  ~ListManager() = default;
??1?$ListManager@H$0P@@analysis@herald@@QEAA@XZ
Line
Count
Source
28
3
  ~ListManager() = default;
??1?$ListManager@N$0P@@analysis@herald@@QEAA@XZ
Line
Count
Source
28
1
  ~ListManager() = default;
??1?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@QEAA@XZ
Line
Count
Source
28
18
  ~ListManager() = default;
??1?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@QEAA@XZ
Line
Count
Source
28
6
  ~ListManager() = default;
29
30
57
  SampleList<Sample<ValT>,Size>& list(const SampledID sampled) {
31
57
    auto iter = lists.try_emplace(sampled).first;
32
57
    return lists.at(sampled);
33
57
  }
?list@?$ListManager@H$0P@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@23@_K@Z
Line
Count
Source
30
2
  SampleList<Sample<ValT>,Size>& list(const SampledID sampled) {
31
2
    auto iter = lists.try_emplace(sampled).first;
32
2
    return lists.at(sampled);
33
2
  }
?list@?$ListManager@N$0P@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@sampling@23@_K@Z
Line
Count
Source
30
2
  SampleList<Sample<ValT>,Size>& list(const SampledID sampled) {
31
2
    auto iter = lists.try_emplace(sampled).first;
32
2
    return lists.at(sampled);
33
2
  }
?list@?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@23@_K@Z
Line
Count
Source
30
28
  SampleList<Sample<ValT>,Size>& list(const SampledID sampled) {
31
28
    auto iter = lists.try_emplace(sampled).first;
32
28
    return lists.at(sampled);
33
28
  }
?list@?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@23@_K@Z
Line
Count
Source
30
25
  SampleList<Sample<ValT>,Size>& list(const SampledID sampled) {
31
25
    auto iter = lists.try_emplace(sampled).first;
32
25
    return lists.at(sampled);
33
25
  }
34
35
  void remove(const SampledID listFor) {
36
    lists.erase(listFor);
37
  }
38
39
4
  const std::size_t size() const {
40
4
    return lists.size();
41
4
  }
?size@?$ListManager@H$0P@@analysis@herald@@QEBA?B_KXZ
Line
Count
Source
39
2
  const std::size_t size() const {
40
2
    return lists.size();
41
2
  }
?size@?$ListManager@N$0P@@analysis@herald@@QEBA?B_KXZ
Line
Count
Source
39
2
  const std::size_t size() const {
40
2
    return lists.size();
41
2
  }
42
43
36
  decltype(auto) begin() {
44
36
    return lists.begin();
45
36
  }
?begin@?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@QEAA?A?<decltype-auto>@@XZ
Line
Count
Source
43
18
  decltype(auto) begin() {
44
18
    return lists.begin();
45
18
  }
?begin@?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@QEAA?A?<decltype-auto>@@XZ
Line
Count
Source
43
18
  decltype(auto) begin() {
44
18
    return lists.begin();
45
18
  }
46
47
36
  decltype(auto) end() {
48
36
    return lists.end();
49
36
  }
?end@?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@QEAA?A?<decltype-auto>@@XZ
Line
Count
Source
47
18
  decltype(auto) end() {
48
18
    return lists.end();
49
18
  }
?end@?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@QEAA?A?<decltype-auto>@@XZ
Line
Count
Source
47
18
  decltype(auto) end() {
48
18
    return lists.end();
49
18
  }
50
51
private:
52
  std::map<SampledID,SampleList<Sample<ValT>,Size>> lists;
53
};
54
55
/// \brief A fixed size set that holds exactly one instance of the std::variant for each
56
/// of the specified ValTs value types.
57
template <typename... ValTs>
58
struct VariantSet {
59
  static constexpr std::size_t Size = sizeof...(ValTs);
60
61
9
  VariantSet() : variants() {
62
9
    createInstances<ValTs...>(0);
63
9
  }; // Instantiate each type instance in the array
??0?$VariantSet@HN@analysis@herald@@QEAA@XZ
Line
Count
Source
61
1
  VariantSet() : variants() {
62
1
    createInstances<ValTs...>(0);
63
1
  }; // Instantiate each type instance in the array
??0?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@QEAA@XZ
Line
Count
Source
61
1
  VariantSet() : variants() {
62
1
    createInstances<ValTs...>(0);
63
1
  }; // Instantiate each type instance in the array
??0?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@QEAA@XZ
Line
Count
Source
61
1
  VariantSet() : variants() {
62
1
    createInstances<ValTs...>(0);
63
1
  }; // Instantiate each type instance in the array
??0?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@QEAA@XZ
Line
Count
Source
61
6
  VariantSet() : variants() {
62
6
    createInstances<ValTs...>(0);
63
6
  }; // Instantiate each type instance in the array
64
8
  ~VariantSet() = default;
??1?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@QEAA@XZ
Line
Count
Source
64
1
  ~VariantSet() = default;
??1?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@QEAA@XZ
Line
Count
Source
64
1
  ~VariantSet() = default;
??1?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@QEAA@XZ
Line
Count
Source
64
6
  ~VariantSet() = default;
65
66
  /// CAN THROW std::bad_variant_access
67
  template <typename ValT>
68
46
  ValT& get() {
69
59
    for (auto& v : variants) {
70
59
      if (auto pval = std::get_if<ValT>(&v)) {
71
46
        return *pval;
72
46
      }
73
59
    }
74
46
    
throw std::bad_variant_access()0
;
75
46
  }
??$get@H@?$VariantSet@HN@analysis@herald@@QEAAAEAHXZ
Line
Count
Source
68
1
  ValT& get() {
69
1
    for (auto& v : variants) {
70
1
      if (auto pval = std::get_if<ValT>(&v)) {
71
1
        return *pval;
72
1
      }
73
1
    }
74
1
    
throw std::bad_variant_access()0
;
75
1
  }
??$get@N@?$VariantSet@HN@analysis@herald@@QEAAAEANXZ
Line
Count
Source
68
1
  ValT& get() {
69
2
    for (auto& v : variants) {
70
2
      if (auto pval = std::get_if<ValT>(&v)) {
71
1
        return *pval;
72
1
      }
73
2
    }
74
1
    
throw std::bad_variant_access()0
;
75
1
  }
??$get@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@@?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@12@XZ
Line
Count
Source
68
2
  ValT& get() {
69
2
    for (auto& v : variants) {
70
2
      if (auto pval = std::get_if<ValT>(&v)) {
71
2
        return *pval;
72
2
      }
73
2
    }
74
2
    
throw std::bad_variant_access()0
;
75
2
  }
??$get@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@sampling@analysis@herald@@@?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@QEAAAEAU?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@sampling@12@XZ
Line
Count
Source
68
2
  ValT& get() {
69
4
    for (auto& v : variants) {
70
4
      if (auto pval = std::get_if<ValT>(&v)) {
71
2
        return *pval;
72
2
      }
73
4
    }
74
2
    
throw std::bad_variant_access()0
;
75
2
  }
??$get@U?$ListManager@H$0P@@analysis@herald@@@?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@QEAAAEAU?$ListManager@H$0P@@12@XZ
Line
Count
Source
68
2
  ValT& get() {
69
2
    for (auto& v : variants) {
70
2
      if (auto pval = std::get_if<ValT>(&v)) {
71
2
        return *pval;
72
2
      }
73
2
    }
74
2
    
throw std::bad_variant_access()0
;
75
2
  }
??$get@U?$ListManager@N$0P@@analysis@herald@@@?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@QEAAAEAU?$ListManager@N$0P@@12@XZ
Line
Count
Source
68
2
  ValT& get() {
69
4
    for (auto& v : variants) {
70
4
      if (auto pval = std::get_if<ValT>(&v)) {
71
2
        return *pval;
72
2
      }
73
4
    }
74
2
    
throw std::bad_variant_access()0
;
75
2
  }
??$get@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@QEAAAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@12@XZ
Line
Count
Source
68
28
  ValT& get() {
69
28
    for (auto& v : variants) {
70
28
      if (auto pval = std::get_if<ValT>(&v)) {
71
28
        return *pval;
72
28
      }
73
28
    }
74
28
    
throw std::bad_variant_access()0
;
75
28
  }
??$get@U?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@QEAAAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@12@XZ
Line
Count
Source
68
8
  ValT& get() {
69
16
    for (auto& v : variants) {
70
16
      if (auto pval = std::get_if<ValT>(&v)) {
71
8
        return *pval;
72
8
      }
73
16
    }
74
8
    
throw std::bad_variant_access()0
;
75
8
  }
76
77
3
  const std::size_t size() const {
78
3
    return variants.size();
79
3
  }
?size@?$VariantSet@HN@analysis@herald@@QEBA?B_KXZ
Line
Count
Source
77
1
  const std::size_t size() const {
78
1
    return variants.size();
79
1
  }
?size@?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@QEBA?B_KXZ
Line
Count
Source
77
1
  const std::size_t size() const {
78
1
    return variants.size();
79
1
  }
?size@?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@QEBA?B_KXZ
Line
Count
Source
77
1
  const std::size_t size() const {
78
1
    return variants.size();
79
1
  }
80
81
52
  decltype(auto) begin() {
82
52
    return variants.begin();
83
52
  }
84
85
52
  decltype(auto) end() {
86
52
    return variants.end();
87
52
  }
88
89
private:
90
  std::array<std::variant<ValTs...>,Size> variants;
91
  template <typename LastT>
92
9
  void createInstances(int pos) {
93
9
    variants[pos].template emplace<LastT>();
94
9
  }
??$createInstances@N@?$VariantSet@HN@analysis@herald@@AEAAXH@Z
Line
Count
Source
92
1
  void createInstances(int pos) {
93
1
    variants[pos].template emplace<LastT>();
94
1
  }
??$createInstances@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@sampling@analysis@herald@@@?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@AEAAXH@Z
Line
Count
Source
92
1
  void createInstances(int pos) {
93
1
    variants[pos].template emplace<LastT>();
94
1
  }
??$createInstances@U?$ListManager@N$0P@@analysis@herald@@@?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@AEAAXH@Z
Line
Count
Source
92
1
  void createInstances(int pos) {
93
1
    variants[pos].template emplace<LastT>();
94
1
  }
??$createInstances@U?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@AEAAXH@Z
Line
Count
Source
92
6
  void createInstances(int pos) {
93
6
    variants[pos].template emplace<LastT>();
94
6
  }
95
96
  template <typename FirstT, typename SecondT, typename... RestT>
97
9
  void createInstances(int pos) {
98
9
    variants[pos].template emplace<FirstT>();
99
9
    createInstances<SecondT,RestT...>(pos + 1);
100
9
  }
??$createInstances@HN$$V@?$VariantSet@HN@analysis@herald@@AEAAXH@Z
Line
Count
Source
97
1
  void createInstances(int pos) {
98
1
    variants[pos].template emplace<FirstT>();
99
1
    createInstances<SecondT,RestT...>(pos + 1);
100
1
  }
??$createInstances@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@$$V@?$VariantSet@U?$SampleList@U?$Sample@H@sampling@analysis@herald@@$0P@H@sampling@analysis@herald@@U?$SampleList@U?$Sample@N@sampling@analysis@herald@@$0P@N@234@@analysis@herald@@AEAAXH@Z
Line
Count
Source
97
1
  void createInstances(int pos) {
98
1
    variants[pos].template emplace<FirstT>();
99
1
    createInstances<SecondT,RestT...>(pos + 1);
100
1
  }
??$createInstances@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@$$V@?$VariantSet@U?$ListManager@H$0P@@analysis@herald@@U?$ListManager@N$0P@@23@@analysis@herald@@AEAAXH@Z
Line
Count
Source
97
1
  void createInstances(int pos) {
98
1
    variants[pos].template emplace<FirstT>();
99
1
    createInstances<SecondT,RestT...>(pos + 1);
100
1
  }
??$createInstances@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@$$V@?$VariantSet@U?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@U?$ListManager@UDistance@datatype@herald@@$0BJ@@23@@analysis@herald@@AEAAXH@Z
Line
Count
Source
97
6
  void createInstances(int pos) {
98
6
    variants[pos].template emplace<FirstT>();
99
6
    createInstances<SecondT,RestT...>(pos + 1);
100
6
  }
101
};
102
103
/// \brief Convenience wrapper for all AnalysisDelegate types used by the analysis API
104
template <typename... DelegateTypes>
105
struct AnalysisDelegateManager {
106
6
  AnalysisDelegateManager(DelegateTypes... dts) : delegates() {
107
6
    addDelegates(0,dts...);
108
6
  }
??0?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAA@UDummyDistanceDelegate@@@Z
Line
Count
Source
106
5
  AnalysisDelegateManager(DelegateTypes... dts) : delegates() {
107
5
    addDelegates(0,dts...);
108
5
  }
??0?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAA@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@12@@Z
Line
Count
Source
106
1
  AnalysisDelegateManager(DelegateTypes... dts) : delegates() {
107
1
    addDelegates(0,dts...);
108
1
  }
109
6
  ~AnalysisDelegateManager() = default;
??1?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAA@XZ
Line
Count
Source
109
5
  ~AnalysisDelegateManager() = default;
??1?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAA@XZ
Line
Count
Source
109
1
  ~AnalysisDelegateManager() = default;
110
111
  template <typename ValT>
112
36
  void notify(SampledID sampled, Sample<ValT> sample) {
113
41
    for (auto& delegateV : delegates) {
114
41
      std::visit([sampled,sample](auto&& arg) {
115
41
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
41
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) 
{0
117
9
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
9
        }
119
41
      }, delegateV);
??$?RAEAUDummyDistanceDelegate@@@<lambda_1>@?0???$notify@VRSSI@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAUDummyDistanceDelegate@@@Z
Line
Count
Source
114
24
      std::visit([sampled,sample](auto&& arg) {
115
24
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
24
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) 
{0
117
24
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
24
        }
119
24
      }, delegateV);
??$?RAEAUDummyDistanceDelegate@@@<lambda_1>@?0???$notify@UDistance@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAUDummyDistanceDelegate@@@Z
Line
Count
Source
114
7
      std::visit([sampled,sample](auto&& arg) {
115
7
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
7
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
7
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
7
        }
119
7
      }, delegateV);
??$?RAEAUDummyDistanceDelegate@@@<lambda_1>@?0???$notify@VRSSI@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAUDummyDistanceDelegate@@@Z
Line
Count
Source
114
4
      std::visit([sampled,sample](auto&& arg) {
115
4
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
4
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) 
{0
117
4
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
4
        }
119
4
      }, delegateV);
??$?RAEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@<lambda_1>@?0???$notify@VRSSI@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@23@@Z
Line
Count
Source
114
4
      std::visit([sampled,sample](auto&& arg) {
115
4
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
4
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) 
{0
117
4
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
4
        }
119
4
      }, delegateV);
??$?RAEAUDummyDistanceDelegate@@@<lambda_1>@?0???$notify@UDistance@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAUDummyDistanceDelegate@@@Z
Line
Count
Source
114
1
      std::visit([sampled,sample](auto&& arg) {
115
1
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
1
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
1
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
1
        }
119
1
      }, delegateV);
??$?RAEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@<lambda_1>@?0???$notify@UDistance@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@23@@Z@QEBA?A?<auto>@@AEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@23@@Z
Line
Count
Source
114
1
      std::visit([sampled,sample](auto&& arg) {
115
1
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
1
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
1
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
1
        }
119
1
      }, delegateV);
120
41
    }
121
36
  }
??$notify@VRSSI@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@12@@Z
Line
Count
Source
112
24
  void notify(SampledID sampled, Sample<ValT> sample) {
113
24
    for (auto& delegateV : delegates) {
114
24
      std::visit([sampled,sample](auto&& arg) {
115
24
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
24
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
24
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
24
        }
119
24
      }, delegateV);
120
24
    }
121
24
  }
??$notify@UDistance@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
112
7
  void notify(SampledID sampled, Sample<ValT> sample) {
113
7
    for (auto& delegateV : delegates) {
114
7
      std::visit([sampled,sample](auto&& arg) {
115
7
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
7
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
7
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
7
        }
119
7
      }, delegateV);
120
7
    }
121
7
  }
??$notify@VRSSI@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@12@@Z
Line
Count
Source
112
4
  void notify(SampledID sampled, Sample<ValT> sample) {
113
8
    for (auto& delegateV : delegates) {
114
8
      std::visit([sampled,sample](auto&& arg) {
115
8
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
8
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
8
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
8
        }
119
8
      }, delegateV);
120
8
    }
121
4
  }
??$notify@UDistance@datatype@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
112
1
  void notify(SampledID sampled, Sample<ValT> sample) {
113
2
    for (auto& delegateV : delegates) {
114
2
      std::visit([sampled,sample](auto&& arg) {
115
2
        using noref = typename std::remove_reference<decltype(arg)>::type;
116
2
        if constexpr (std::is_same_v<ValT,typename noref::value_type>) {
117
2
          ((decltype(arg))arg).newSample(sampled,sample); // cast to call derived class function
118
2
        }
119
2
      }, delegateV);
120
2
    }
121
1
  }
122
123
  /// CAN THROW std::bad_variant_access
124
  template <typename DelegateT>
125
6
  DelegateT& get() {
126
6
    for (auto& v : delegates) {
127
6
      if (auto pval = std::get_if<DelegateT>(&v)) {
128
6
        return *pval;
129
6
      }
130
6
    }
131
6
    
throw std::bad_variant_access()0
;
132
6
  }
??$get@UDummyDistanceDelegate@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@QEAAAEAUDummyDistanceDelegate@@XZ
Line
Count
Source
125
5
  DelegateT& get() {
126
5
    for (auto& v : delegates) {
127
5
      if (auto pval = std::get_if<DelegateT>(&v)) {
128
5
        return *pval;
129
5
      }
130
5
    }
131
5
    
throw std::bad_variant_access()0
;
132
5
  }
??$get@UDummyDistanceDelegate@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@QEAAAEAUDummyDistanceDelegate@@XZ
Line
Count
Source
125
1
  DelegateT& get() {
126
1
    for (auto& v : delegates) {
127
1
      if (auto pval = std::get_if<DelegateT>(&v)) {
128
1
        return *pval;
129
1
      }
130
1
    }
131
1
    
throw std::bad_variant_access()0
;
132
1
  }
133
134
private:
135
  std::array<std::variant<DelegateTypes...>,sizeof...(DelegateTypes)> delegates;
136
137
  template <typename LastT>
138
6
  constexpr void addDelegates(int nextPos,LastT&& last) {
139
6
    delegates[nextPos] = (std::move(last));
140
6
  }
??$addDelegates@AEAUDummyDistanceDelegate@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@AEAAXHAEAUDummyDistanceDelegate@@@Z
Line
Count
Source
138
5
  constexpr void addDelegates(int nextPos,LastT&& last) {
139
5
    delegates[nextPos] = (std::move(last));
140
5
  }
??$addDelegates@AEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@AEAAXHAEAU?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@12@@Z
Line
Count
Source
138
1
  constexpr void addDelegates(int nextPos,LastT&& last) {
139
1
    delegates[nextPos] = (std::move(last));
140
1
  }
141
142
  template <typename FirstT, typename SecondT, typename... RestT>
143
1
  constexpr void addDelegates(int nextPos,FirstT&& first, SecondT&& second, RestT&&... rest) {
144
1
    delegates[nextPos] = std::move(first);
145
1
    ++nextPos;
146
1
    addDelegates(nextPos,second,rest...);
147
1
  }
148
};
149
150
/// \brief Convenience wrapper for all AnalysisProvider types used by the analysis API
151
template <typename... ProviderTypes>
152
struct AnalysisProviderManager {
153
  // Set for GCC 8/9. See https://stackoverflow.com/questions/63812165/stdvariant-requires-default-constructor-in-gcc-8-and-9-and-not-require-in-gcc
154
  AnalysisProviderManager() = delete;
155
6
  AnalysisProviderManager(ProviderTypes... prvs) : providers() {
156
6
    addProviders(0, prvs...);
157
6
  }
158
6
  ~AnalysisProviderManager() = default;
159
160
  template <typename InputValT, std::size_t SrcSz, typename SourceType, std::size_t ListSize, typename CallableForNewSample>
161
17
  bool analyse(Date timeNow, SampledID sampled, SampleList<Sample<InputValT>,SrcSz>& src, ListManager<SourceType,ListSize>& lists, CallableForNewSample& callable) {
162
17
    bool generated = false;
163
17
    for (auto& providerV : providers) {
164
17
      std::visit([&timeNow,&sampled,&src,&lists,&generated,&callable](auto&& arg) {
165
17
        using noref = typename std::remove_reference<decltype(arg)>::type;
166
17
        // Ensure our calee supports the types we have
167
17
        if constexpr (std::is_same_v<InputValT, typename noref::input_value_type>) 
{0
168
17
          auto& listRef = lists.list(sampled);
169
17
          generated = generated | ((decltype(arg))arg).analyse(timeNow,sampled,src,listRef,callable);
170
17
        }
171
17
      }, providerV);
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@VRSSI@datatype@herald@@$0BJ@V123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@23@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@VRSSI@datatype@herald@@$0BJ@UDistance@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@23@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
164
15
      std::visit([&timeNow,&sampled,&src,&lists,&generated,&callable](auto&& arg) {
165
15
        using noref = typename std::remove_reference<decltype(arg)>::type;
166
15
        // Ensure our calee supports the types we have
167
15
        if constexpr (std::is_same_v<InputValT, typename noref::input_value_type>) {
168
15
          auto& listRef = lists.list(sampled);
169
15
          generated = generated | ((decltype(arg))arg).analyse(timeNow,sampled,src,listRef,callable);
170
15
        }
171
15
      }, providerV);
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@UDistance@datatype@herald@@$0BJ@VRSSI@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@23@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@UDistance@datatype@herald@@$0BJ@U123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@23@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@VRSSI@datatype@herald@@$0BJ@V123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@23@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@VRSSI@datatype@herald@@$0BJ@UDistance@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@23@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
164
2
      std::visit([&timeNow,&sampled,&src,&lists,&generated,&callable](auto&& arg) {
165
2
        using noref = typename std::remove_reference<decltype(arg)>::type;
166
2
        // Ensure our calee supports the types we have
167
2
        if constexpr (std::is_same_v<InputValT, typename noref::input_value_type>) {
168
2
          auto& listRef = lists.list(sampled);
169
2
          generated = generated | ((decltype(arg))arg).analyse(timeNow,sampled,src,listRef,callable);
170
2
        }
171
2
      }, providerV);
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@UDistance@datatype@herald@@$0BJ@VRSSI@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@23@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Unexecuted instantiation: ??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$analyse@UDistance@datatype@herald@@$0BJ@U123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@3@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@23@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@23@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@23@@Z@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
172
17
    }
173
17
    return generated;
174
17
  }
Unexecuted instantiation: ??$analyse@VRSSI@datatype@herald@@$0BJ@V123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@12@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
??$analyse@VRSSI@datatype@herald@@$0BJ@UDistance@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@12@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
Line
Count
Source
161
15
  bool analyse(Date timeNow, SampledID sampled, SampleList<Sample<InputValT>,SrcSz>& src, ListManager<SourceType,ListSize>& lists, CallableForNewSample& callable) {
162
15
    bool generated = false;
163
15
    for (auto& providerV : providers) {
164
15
      std::visit([&timeNow,&sampled,&src,&lists,&generated,&callable](auto&& arg) {
165
15
        using noref = typename std::remove_reference<decltype(arg)>::type;
166
15
        // Ensure our calee supports the types we have
167
15
        if constexpr (std::is_same_v<InputValT, typename noref::input_value_type>) {
168
15
          auto& listRef = lists.list(sampled);
169
15
          generated = generated | ((decltype(arg))arg).analyse(timeNow,sampled,src,listRef,callable);
170
15
        }
171
15
      }, providerV);
172
15
    }
173
15
    return generated;
174
15
  }
Unexecuted instantiation: ??$analyse@UDistance@datatype@herald@@$0BJ@VRSSI@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@12@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
Unexecuted instantiation: ??$analyse@UDistance@datatype@herald@@$0BJ@U123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@12@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
Unexecuted instantiation: ??$analyse@VRSSI@datatype@herald@@$0BJ@V123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@12@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
??$analyse@VRSSI@datatype@herald@@$0BJ@UDistance@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@$0BJ@VRSSI@datatype@4@@sampling@12@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
Line
Count
Source
161
2
  bool analyse(Date timeNow, SampledID sampled, SampleList<Sample<InputValT>,SrcSz>& src, ListManager<SourceType,ListSize>& lists, CallableForNewSample& callable) {
162
2
    bool generated = false;
163
2
    for (auto& providerV : providers) {
164
2
      std::visit([&timeNow,&sampled,&src,&lists,&generated,&callable](auto&& arg) {
165
2
        using noref = typename std::remove_reference<decltype(arg)>::type;
166
2
        // Ensure our calee supports the types we have
167
2
        if constexpr (std::is_same_v<InputValT, typename noref::input_value_type>) {
168
2
          auto& listRef = lists.list(sampled);
169
2
          generated = generated | ((decltype(arg))arg).analyse(timeNow,sampled,src,listRef,callable);
170
2
        }
171
2
      }, providerV);
172
2
    }
173
2
    return generated;
174
2
  }
Unexecuted instantiation: ??$analyse@UDistance@datatype@herald@@$0BJ@VRSSI@23@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@12@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
Unexecuted instantiation: ??$analyse@UDistance@datatype@herald@@$0BJ@U123@$0BJ@U?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@3@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NVDate@datatype@2@_KAEAU?$SampleList@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@$0BJ@UDistance@datatype@4@@sampling@12@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@12@AEAU?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@12@@Z
175
176
  /// CAN THROW std::bad_variant_access
177
  template <typename ProviderT>
178
  ProviderT& get() {
179
    for (auto& v : providers) {
180
      if (auto pval = std::get_if<ProviderT>(&v)) {
181
        return *pval;
182
      }
183
    }
184
    throw std::bad_variant_access();
185
  }
186
187
  template <typename InputT,typename OutputT>
188
68
  constexpr bool hasMatchingAnalyser() noexcept {
189
68
    bool match = false;
190
68
    for (auto& providerV : providers) {
191
68
      std::visit([&match] (auto&& provider) {
192
68
        using InputValT = typename InputT::value_type;
193
68
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
68
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
68
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
68
        // InT inInstance;
197
68
        // OutT outInstance;
198
68
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
68
        // InputValT inputInstance;
200
68
        // OutputT outputInstance;
201
68
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
68
        if constexpr (std::is_same_v<InputValT,InT> && 
std::is_same_v<OutputT,OutT>0
)
{0
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
68
      }, providerV);
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$hasMatchingAnalyser@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@VRSSI@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && 
std::is_same_v<OutputT,OutT>0
)
{0
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$hasMatchingAnalyser@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@UDistance@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && 
std::is_same_v<OutputT,OutT>0
) {
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$hasMatchingAnalyser@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@VRSSI@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && 
std::is_same_v<OutputT,OutT>0
)
{0
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
??$?RAEAUFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@<lambda_1>@?0???$hasMatchingAnalyser@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@UDistance@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ@QEBA?A?<auto>@@AEAUFowlerBasicAnalyser@distance@algorithms@23@@Z
Line
Count
Source
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && 
std::is_same_v<OutputT,OutT>0
)
{0
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
207
68
    }
208
68
    return match;
209
68
  }
??$hasMatchingAnalyser@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@VRSSI@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ
Line
Count
Source
188
17
  constexpr bool hasMatchingAnalyser() noexcept {
189
17
    bool match = false;
190
17
    for (auto& providerV : providers) {
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && std::is_same_v<OutputT,OutT>) {
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
207
17
    }
208
17
    return match;
209
17
  }
??$hasMatchingAnalyser@U?$Sample@VRSSI@datatype@herald@@@sampling@analysis@herald@@UDistance@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ
Line
Count
Source
188
17
  constexpr bool hasMatchingAnalyser() noexcept {
189
17
    bool match = false;
190
17
    for (auto& providerV : providers) {
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && std::is_same_v<OutputT,OutT>) {
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
207
17
    }
208
17
    return match;
209
17
  }
??$hasMatchingAnalyser@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@VRSSI@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ
Line
Count
Source
188
17
  constexpr bool hasMatchingAnalyser() noexcept {
189
17
    bool match = false;
190
17
    for (auto& providerV : providers) {
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && std::is_same_v<OutputT,OutT>) {
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
207
17
    }
208
17
    return match;
209
17
  }
??$hasMatchingAnalyser@U?$Sample@UDistance@datatype@herald@@@sampling@analysis@herald@@UDistance@datatype@4@@?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@analysis@herald@@QEAA_NXZ
Line
Count
Source
188
17
  constexpr bool hasMatchingAnalyser() noexcept {
189
17
    bool match = false;
190
17
    for (auto& providerV : providers) {
191
17
      std::visit([&match] (auto&& provider) {
192
17
        using InputValT = typename InputT::value_type;
193
17
        using InT = typename std::remove_reference_t<decltype(provider)>::input_value_type;
194
17
        using OutT = typename std::remove_reference_t<decltype(provider)>::output_value_type;
195
17
        // std::cout << "  Provider being checked " << typeid(provider).name() << std::endl;
196
17
        // InT inInstance;
197
17
        // OutT outInstance;
198
17
        // std::cout << "    In type " << typeid(inInstance).name() << ", out type " << typeid(outInstance).name() << std::endl;
199
17
        // InputValT inputInstance;
200
17
        // OutputT outputInstance;
201
17
        // std::cout << "    Input type " << typeid(inputInstance).name() << ", output type " << typeid(outputInstance).name() << std::endl;
202
17
        if constexpr (std::is_same_v<InputValT,InT> && std::is_same_v<OutputT,OutT>) {
203
17
          match = true;
204
17
          // std::cout << "  MATCHED!" << std::endl;
205
17
        }
206
17
      }, providerV);
207
17
    }
208
17
    return match;
209
17
  }
210
211
private:
212
  std::array<std::variant<ProviderTypes...>,sizeof...(ProviderTypes)> providers;
213
214
  template <typename LastT>
215
6
  constexpr void addProviders(int nextPos, LastT&& last) {
216
6
    providers[nextPos] = std::move(last);
217
6
  }
218
219
  template <typename FirstT, typename SecondT, typename... RestT>
220
  constexpr void addProviders(int nextPos, FirstT&& first, SecondT&& second, RestT&&... rest) {
221
    providers[nextPos] = std::move(first);
222
    ++nextPos;
223
    addProviders(nextPos,second,rest...);
224
  }
225
};
226
227
/// \brief Manages all sample lists, sources, sinks, and analysis instances for all data generated within a system
228
///
229
/// This class can be used 'live' against real sensors, or statically with reference data. 
230
/// This is achieved by ensuring the run(Date) method takes in the Date for the time of evaluation rather
231
/// than using the current Date.
232
template <typename AnalysisDelegateManagerT, typename AnalysisProviderManagerT, typename... SourceTypes> // TODO derive SourceTypes from providers and delegates // TODO parameterise type lengths somehow (traits template?)
233
struct AnalysisRunner {
234
  static constexpr std::size_t ListSize = 25; // TODO make this external somehow for each type (trait?)
235
  // using valueTypes = (typename SourceTypes::value_type)...;
236
237
6
  AnalysisRunner(AnalysisDelegateManagerT& adm, AnalysisProviderManagerT& provds) : lists(), delegates(adm), runners(provds) /*, hasNewData(false)*/ {}
??0?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAA@AEAU?$AnalysisDelegateManager@UDummyDistanceDelegate@@@12@AEAU?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@12@@Z
Line
Count
Source
237
5
  AnalysisRunner(AnalysisDelegateManagerT& adm, AnalysisProviderManagerT& provds) : lists(), delegates(adm), runners(provds) /*, hasNewData(false)*/ {}
??0?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAA@AEAU?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@12@AEAU?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@12@@Z
Line
Count
Source
237
1
  AnalysisRunner(AnalysisDelegateManagerT& adm, AnalysisProviderManagerT& provds) : lists(), delegates(adm), runners(provds) /*, hasNewData(false)*/ {}
238
6
  ~AnalysisRunner() = default;
??1?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAA@XZ
Line
Count
Source
238
5
  ~AnalysisRunner() = default;
??1?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAA@XZ
Line
Count
Source
238
1
  ~AnalysisRunner() = default;
239
240
  /// We are an analysis delegate ourselves - this is used by Source types, and by producers (analysis runners)
241
  template <typename ValT>
242
36
  void newSample(SampledID sampled, sampling::Sample<ValT> sample) {
243
36
    // incoming sample. Pass to correct list
244
36
    lists.template get<ListManager<ValT,ListSize>>().list(sampled).push(sample); // TODO get ListSize dynamically
245
36
    // inform delegates
246
36
    delegates.notify(sampled,sample);
247
36
  }
??$newSample@VRSSI@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@12@@Z
Line
Count
Source
242
24
  void newSample(SampledID sampled, sampling::Sample<ValT> sample) {
243
24
    // incoming sample. Pass to correct list
244
24
    lists.template get<ListManager<ValT,ListSize>>().list(sampled).push(sample); // TODO get ListSize dynamically
245
24
    // inform delegates
246
24
    delegates.notify(sampled,sample);
247
24
  }
??$newSample@UDistance@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
242
7
  void newSample(SampledID sampled, sampling::Sample<ValT> sample) {
243
7
    // incoming sample. Pass to correct list
244
7
    lists.template get<ListManager<ValT,ListSize>>().list(sampled).push(sample); // TODO get ListSize dynamically
245
7
    // inform delegates
246
7
    delegates.notify(sampled,sample);
247
7
  }
??$newSample@VRSSI@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@VRSSI@datatype@herald@@@sampling@12@@Z
Line
Count
Source
242
4
  void newSample(SampledID sampled, sampling::Sample<ValT> sample) {
243
4
    // incoming sample. Pass to correct list
244
4
    lists.template get<ListManager<ValT,ListSize>>().list(sampled).push(sample); // TODO get ListSize dynamically
245
4
    // inform delegates
246
4
    delegates.notify(sampled,sample);
247
4
  }
??$newSample@UDistance@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
242
1
  void newSample(SampledID sampled, sampling::Sample<ValT> sample) {
243
1
    // incoming sample. Pass to correct list
244
1
    lists.template get<ListManager<ValT,ListSize>>().list(sampled).push(sample); // TODO get ListSize dynamically
245
1
    // inform delegates
246
1
    delegates.notify(sampled,sample);
247
1
  }
248
249
  template <typename ValT>
250
8
  void operator()(SampledID sampled,sampling::Sample<ValT> sample) {
251
8
    newSample(sampled,sample);
252
8
  }
??$?RUDistance@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
250
7
  void operator()(SampledID sampled,sampling::Sample<ValT> sample) {
251
7
    newSample(sampled,sample);
252
7
  }
??$?RUDistance@datatype@herald@@@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAX_KU?$Sample@UDistance@datatype@herald@@@sampling@12@@Z
Line
Count
Source
250
1
  void operator()(SampledID sampled,sampling::Sample<ValT> sample) {
251
1
    newSample(sampled,sample);
252
1
  }
253
254
  /// Run the relevant analyses given the current time point
255
18
  void run(Date timeNow) {
256
18
    // call analyse(dateNow,srcList,dstDelegate) for all delegates with the correct list each, for each sampled
257
18
    
258
18
    // DO NOT USE Performance enhancement - 'dirty' sample lists only (ones with new data)
259
18
    // The reason this is commented out is because for some analysers producing a new value based on no new data may be valid.
260
18
    // if (!hasNewData) {
261
18
    //   // This also prevents 'new' conversions even if no new data has arrived, skewing analysis results
262
18
    //   return;
263
18
    // }
264
36
    for (auto& listManager : lists) { // For each input list
265
36
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
36
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
34
          // Derived Input type and size from 'list' input list
268
34
          
269
34
          auto& sampled = mgrPair.first;
270
34
          auto& list = mgrPair.second;
271
34
272
68
          for (auto& outputListManagerV : lists) {
273
68
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
68
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
68
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
68
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
68
278
68
              // Check for presence of an analyser that converts from InputValT to LMValT
279
68
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
17
                // std::cout << "Found matching analyser!" << std::endl;
281
17
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
17
              }
283
68
            }, outputListManagerV);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@1@Z
Line
Count
Source
273
15
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
15
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
15
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
15
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
15
278
15
              // Check for presence of an analyser that converts from InputValT to LMValT
279
15
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
15
            }, outputListManagerV);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
273
15
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
15
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
15
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
15
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
15
278
15
              // Check for presence of an analyser that converts from InputValT to LMValT
279
15
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
15
                // std::cout << "Found matching analyser!" << std::endl;
281
15
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
15
              }
283
15
            }, outputListManagerV);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
273
15
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
15
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
15
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
15
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
15
278
15
              // Check for presence of an analyser that converts from InputValT to LMValT
279
15
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
15
            }, outputListManagerV);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@1@Z
Line
Count
Source
273
15
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
15
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
15
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
15
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
15
278
15
              // Check for presence of an analyser that converts from InputValT to LMValT
279
15
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
15
            }, outputListManagerV);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@1@Z
Line
Count
Source
273
2
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
2
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
2
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
2
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
2
278
2
              // Check for presence of an analyser that converts from InputValT to LMValT
279
2
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
2
            }, outputListManagerV);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
273
2
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
2
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
2
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
2
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
2
278
2
              // Check for presence of an analyser that converts from InputValT to LMValT
279
2
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
2
                // std::cout << "Found matching analyser!" << std::endl;
281
2
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
2
              }
283
2
            }, outputListManagerV);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
273
2
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
2
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
2
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
2
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
2
278
2
              // Check for presence of an analyser that converts from InputValT to LMValT
279
2
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
2
            }, outputListManagerV);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0???$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@0?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z@QEBA?A?7@1@Z
Line
Count
Source
273
2
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
2
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
2
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
2
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
2
278
2
              // Check for presence of an analyser that converts from InputValT to LMValT
279
2
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
0
                // std::cout << "Found matching analyser!" << std::endl;
281
0
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
0
              }
283
2
            }, outputListManagerV);
284
68
          }
285
34
        }
286
36
      }, listManager);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
265
16
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
16
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
15
          // Derived Input type and size from 'list' input list
268
15
          
269
15
          auto& sampled = mgrPair.first;
270
15
          auto& list = mgrPair.second;
271
15
272
30
          for (auto& outputListManagerV : lists) {
273
30
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
30
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
30
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
30
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
30
278
30
              // Check for presence of an analyser that converts from InputValT to LMValT
279
30
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
30
                // std::cout << "Found matching analyser!" << std::endl;
281
30
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
30
              }
283
30
            }, outputListManagerV);
284
30
          }
285
15
        }
286
16
      }, listManager);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
265
16
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
16
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
15
          // Derived Input type and size from 'list' input list
268
15
          
269
15
          auto& sampled = mgrPair.first;
270
15
          auto& list = mgrPair.second;
271
15
272
30
          for (auto& outputListManagerV : lists) {
273
30
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
30
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
30
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
30
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
30
278
30
              // Check for presence of an analyser that converts from InputValT to LMValT
279
30
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
30
                // std::cout << "Found matching analyser!" << std::endl;
281
30
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
30
              }
283
30
            }, outputListManagerV);
284
30
          }
285
15
        }
286
16
      }, listManager);
??$?RAEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@VRSSI@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
265
2
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
2
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
2
          // Derived Input type and size from 'list' input list
268
2
          
269
2
          auto& sampled = mgrPair.first;
270
2
          auto& list = mgrPair.second;
271
2
272
4
          for (auto& outputListManagerV : lists) {
273
4
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
4
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
4
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
4
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
4
278
4
              // Check for presence of an analyser that converts from InputValT to LMValT
279
4
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
4
                // std::cout << "Found matching analyser!" << std::endl;
281
4
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
4
              }
283
4
            }, outputListManagerV);
284
4
          }
285
2
        }
286
2
      }, listManager);
??$?RAEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@analysis@herald@@@<lambda_1>@?0??run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@4@@Z@QEBA?A?<auto>@@AEAU?$ListManager@UDistance@datatype@herald@@$0BJ@@34@@Z
Line
Count
Source
265
2
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
2
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
2
          // Derived Input type and size from 'list' input list
268
2
          
269
2
          auto& sampled = mgrPair.first;
270
2
          auto& list = mgrPair.second;
271
2
272
4
          for (auto& outputListManagerV : lists) {
273
4
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
4
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
4
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
4
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
4
278
4
              // Check for presence of an analyser that converts from InputValT to LMValT
279
4
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
4
                // std::cout << "Found matching analyser!" << std::endl;
281
4
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
4
              }
283
4
            }, outputListManagerV);
284
4
          }
285
2
        }
286
2
      }, listManager);
287
36
    }
288
18
    // hasNewData = false;
289
18
  }
?run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@3@@Z
Line
Count
Source
255
16
  void run(Date timeNow) {
256
16
    // call analyse(dateNow,srcList,dstDelegate) for all delegates with the correct list each, for each sampled
257
16
    
258
16
    // DO NOT USE Performance enhancement - 'dirty' sample lists only (ones with new data)
259
16
    // The reason this is commented out is because for some analysers producing a new value based on no new data may be valid.
260
16
    // if (!hasNewData) {
261
16
    //   // This also prevents 'new' conversions even if no new data has arrived, skewing analysis results
262
16
    //   return;
263
16
    // }
264
32
    for (auto& listManager : lists) { // For each input list
265
32
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
32
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
32
          // Derived Input type and size from 'list' input list
268
32
          
269
32
          auto& sampled = mgrPair.first;
270
32
          auto& list = mgrPair.second;
271
32
272
32
          for (auto& outputListManagerV : lists) {
273
32
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
32
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
32
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
32
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
32
278
32
              // Check for presence of an analyser that converts from InputValT to LMValT
279
32
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
32
                // std::cout << "Found matching analyser!" << std::endl;
281
32
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
32
              }
283
32
            }, outputListManagerV);
284
32
          }
285
32
        }
286
32
      }, listManager);
287
32
    }
288
16
    // hasNewData = false;
289
16
  }
?run@?$AnalysisRunner@U?$AnalysisDelegateManager@UDummyDistanceDelegate@@U?$LoggingAnalysisDelegate@U?$Context@UDefaultPlatformType@herald@@UDummyLoggingSink@@VDummyBluetoothStateManager@@@herald@@UDistance@datatype@2@@analysis@herald@@@analysis@herald@@U?$AnalysisProviderManager@UFowlerBasicAnalyser@distance@algorithms@analysis@herald@@@23@VRSSI@datatype@3@UDistance@63@@analysis@herald@@QEAAXVDate@datatype@3@@Z
Line
Count
Source
255
2
  void run(Date timeNow) {
256
2
    // call analyse(dateNow,srcList,dstDelegate) for all delegates with the correct list each, for each sampled
257
2
    
258
2
    // DO NOT USE Performance enhancement - 'dirty' sample lists only (ones with new data)
259
2
    // The reason this is commented out is because for some analysers producing a new value based on no new data may be valid.
260
2
    // if (!hasNewData) {
261
2
    //   // This also prevents 'new' conversions even if no new data has arrived, skewing analysis results
262
2
    //   return;
263
2
    // }
264
4
    for (auto& listManager : lists) { // For each input list
265
4
      std::visit([timeNow,this] (auto&& arg) { // Visit each of our list managers (that may be used as an output list)
266
4
        for (auto& mgrPair : arg) { // For each output list instance // arg = ListManager<SampleList<InputValueT>,SrcSz>
267
4
          // Derived Input type and size from 'list' input list
268
4
          
269
4
          auto& sampled = mgrPair.first;
270
4
          auto& list = mgrPair.second;
271
4
272
4
          for (auto& outputListManagerV : lists) {
273
4
            std::visit([timeNow, &list, &sampled, this] (auto&& outputListManager) { // Visit each of our list managers (that may be used as an output list)
274
4
              using InputValT = typename std::remove_reference_t<decltype(list)>::value_type;
275
4
              using LMValT = typename std::remove_reference_t<decltype(outputListManager)>::value_type;
276
4
              // std::cout << "Trying to call analysers for source type " << typeid(list).name() << " to output type " << typeid(outputListManager).name() << std::endl;
277
4
278
4
              // Check for presence of an analyser that converts from InputValT to LMValT
279
4
              if (runners.template hasMatchingAnalyser<InputValT,LMValT>()) {
280
4
                // std::cout << "Found matching analyser!" << std::endl;
281
4
                /*bool newDataGenerated =*/ runners.template analyse(timeNow,sampled,list,outputListManager, *this); // <InputValT,InputSz,LMValT,LMSz>
282
4
              }
283
4
            }, outputListManagerV);
284
4
          }
285
4
        }
286
4
      }, listManager);
287
4
    }
288
2
    // hasNewData = false;
289
2
  }
290
291
private:
292
  // TODO make sizes a parameterised list derived from template parameters
293
  VariantSet<ListManager<SourceTypes,ListSize>...> lists; // exactly one list manager per value type
294
  AnalysisDelegateManagerT& delegates;
295
  AnalysisProviderManagerT& runners;
296
  // bool hasNewData;
297
};
298
299
}
300
}
301
302
#endif